package com.learn.netty.itdragon.bio;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * IO 也称为 BIO，Block IO 阻塞同步的通讯方式 <br>
 * 比较传统的技术，实际开发中基本上用Netty或者是AIO。熟悉BIO，NIO，体会其中变化的过程。
 * 作为一个web开发人员，stock通讯面试经常问题。<br>
 * BIO最大的问题是：阻塞，同步。<br>
 * BIO通讯方式很依赖于网络，若网速不好，阻塞时间会很长。每次请求都由程序执行并返回，这是同步的缺陷。 <br>
 * <h3>BIO工作流程：</h3>
 * <ul>
 * <li>第一步：server端服务器启动</li>
 * <li>第二步：server端服务器阻塞监听（accept）client请求</li>
 * <li>第三步：server端服务器接收请求，创建线程实现任务</li>
 * </ul>
 *
 * @author itdragon
 */
public class ITDragonBIOServer {

    private static final Integer PORT = 8888; // 服务器对外的端口号

    public static void main(String[] args) {
        ServerSocket server = null;
        Socket socket = null;
        ThreadPoolExecutor executor = null;
        try {
            server = new ServerSocket(PORT); // ServerSocket 启动监听端口  
            System.out.println(Thread.currentThread().getName() + " BIO Server 服务器启动 PORT：" + PORT);
            executor = new ThreadPoolExecutor(
                    10,
                    100,
                    1000,
                    TimeUnit.SECONDS,
                    new ArrayBlockingQueue<Runnable>(50));
            while (true) {
                socket = server.accept();  // 服务器监听：阻塞，等待Client请求 
                ITDragonBIOServerHandler serverHandler = new ITDragonBIOServerHandler(socket);
                executor.execute(serverHandler);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != socket) socket.close();
                if (null != server) server.close();
                executor.shutdown();
                System.out.println("BIO Server 服务器关闭了！！！！");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
